home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / pctjjl86.arc / CXOR.C < prev    next >
Text File  |  1986-04-16  |  7KB  |  177 lines

  1. /*** Listing 3 ***/
  2. /* This program benchmarks the C exclusive-OR driver */
  3. #include <stdio.h>
  4. #include <dos.h>
  5. /* Eight objects will be moved on the screen 700 times */
  6. #define NUM_ITERATIONS    700
  7. #define NUM_OBJECTS    8
  8. /*  The position, screen boundaries, and distance to move the objects
  9.     each iteration are stored below */
  10. int row[NUM_OBJECTS]          = {100,100,100,100,100,100,100,100};
  11. int column[NUM_OBJECTS]       = { 32, 32, 32, 32, 32, 32, 32, 32};
  12. int row_increment[NUM_OBJECTS]      = { -2,  2,  0, -2,  0,  0, -2,  2};
  13. int column_increment[NUM_OBJECTS] = {  1,  1,  0, -1,  1, -1,  0, -1};
  14. int left_margin[NUM_OBJECTS]      = {  0,  0,  0,  0,  0,  0,  0,  0};
  15. int right_margin[NUM_OBJECTS]      = { 76, 74, 72, 70, 70, 72, 74, 76};
  16. int top_margin[NUM_OBJECTS]      = {  0,  0,  0,  0,  0,  0,  0,  0};
  17. int bottom_margin[NUM_OBJECTS]      = {194,184,174,164,164,174,184,194};
  18. /* Four rectangular forms, f0,f1,f2 & f3 are defined below. Each form
  19.    starts with the number of lines and rows in the image. These two
  20.    bytes are then followed by the image which will be placed into
  21.    the screen memory map. */
  22. unsigned char f0[] = { 6, 4,
  23.     0xf0, 0x0f, 0xf0, 0x0f,
  24.     0xf0, 0x3f, 0xfc, 0x0f,
  25.     0xff, 0xff, 0xff, 0xff,
  26.     0xf0, 0xff, 0xff, 0x0f,
  27.     0xf0, 0x3f, 0xfc, 0x0f,
  28.     0xf0, 0x0f, 0xf0, 0x0f};
  29. unsigned char f1[] = { 16, 6,
  30.     0x55,  0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
  31.     0x55,  0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
  32.     0x55,  0x55, 0x55, 0x55,
  33.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  34.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  35.     0xff, 0xff, 0xff, 0xff,
  36.     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  37.     0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  38.     0xaa, 0xaa, 0xaa, 0xaa,
  39.     0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
  40.     0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
  41.     0x55, 0x55, 0x55, 0x55};
  42. unsigned char f2[] = { 26, 8,
  43.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  44.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  45.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  46.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  47.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  48.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  49.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  50.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  51.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  52.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  53.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  54.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  55.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  56.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  57.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  58.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  59.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  60.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  61.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  62.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  63.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  64.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  65.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  66.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  67.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff,
  68.     0xff, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0xff};
  69. unsigned char f3[] = { 36, 10,
  70.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  71.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  72.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  73.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  74.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  75.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  76.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  77.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  78.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  79.     0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff,
  80.     0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff,
  81.     0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff,
  82.     0xff, 0xff, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xff, 0xff,
  83.     0xff, 0xff, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xff, 0xff,
  84.     0xff, 0xff, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xff, 0xff,
  85.     0xff, 0xff, 0xaa, 0x55, 0x00, 0x00, 0x55, 0xaa, 0xff, 0xff,
  86.     0xff, 0xff, 0xaa, 0x55, 0x00, 0x00, 0x55, 0xaa, 0xff, 0xff,
  87.     0xff, 0xff, 0xaa, 0x55, 0x00, 0x00, 0x55, 0xaa, 0xff, 0xff,
  88.     0xff, 0xff, 0xaa, 0x55, 0x00, 0x00, 0x55, 0xaa, 0xff, 0xff,
  89.     0xff, 0xff, 0xaa, 0x55, 0x00, 0x00, 0x55, 0xaa, 0xff, 0xff,
  90.     0xff, 0xff, 0xaa, 0x55, 0x00, 0x00, 0x55, 0xaa, 0xff, 0xff,
  91.     0xff, 0xff, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xff, 0xff,
  92.     0xff, 0xff, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xff, 0xff,
  93.     0xff, 0xff, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xff, 0xff,
  94.     0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff,
  95.     0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff,
  96.     0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff,
  97.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  98.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  99.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  100.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  101.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  102.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  103.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  104.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  105.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  106. /* The list of forms to be used for the eight objects follows */
  107. unsigned char *form_address[NUM_OBJECTS] 
  108.     = { f0, f1, f2, f3, f3, f2, f1, f0};
  109.  
  110. main()
  111. {
  112.     struct reg inregs, outregs;
  113.     register int i, j;
  114.  
  115. /* set 320x200 graphics mode */
  116.     inregs.r_ax = 4;
  117.     intcall(&inregs,&outregs,0x10);
  118. /* put forms on screen for the first time */
  119.     j = NUM_OBJECTS - 1;
  120.     do {
  121.         form_driver(row[j],column[j],form_address[j]);
  122.     } while ( j-- != 0 );
  123. /* for # of iterations, move each object in turn */
  124.     i = NUM_ITERATIONS - 1;
  125.     do {
  126.         j = NUM_OBJECTS - 1;
  127.         do {
  128.         form_driver(row[j],column[j],form_address[j]);
  129.         if ( row[j] <= top_margin[j] || row[j] 
  130.             >= bottom_margin[j] )
  131.             row_increment[j] *= -1;
  132.         if ( column[j] <= left_margin[j] || column[j] 
  133.             >= right_margin[j] )
  134.             column_increment[j] *= -1;
  135.         row[j] += row_increment[j];
  136.         column[j] += column_increment[j];
  137.         form_driver(row[j],column[j],form_address[j]);
  138.         } while ( j-- != 0 );
  139.     } while ( i-- != 0 );
  140. /* set 80x25 text mode before returning to DOS */
  141.     inregs.r_ax = 2;
  142.     intcall(&inregs,&outregs,0x10);
  143. }
  144.  
  145. /* exclusive-OR driver */
  146. form_driver(r,c,fax)
  147. /* r and c are the row and column at which to put object.
  148.    r is the line number and can range from 0 - 199. 0 is the top line.
  149.    c is the column byte number and can range from 0 - 79; 0 leftmost.
  150.    fax is a pointer to the form to be XORed into screen memory */
  151. int r, c;
  152. unsigned char *fax;
  153. {
  154.     register int offset;
  155.     register unsigned char *fa;
  156.     int toffset, i, j, k;
  157.  
  158.     fa = fax;
  159.     if ( ( r & 1 ) == 0 )
  160.         offset = ( r >> 1 ) * 80 + c;
  161.     else
  162.         offset = ( r >> 1 ) * 80 + c + 0x2000;
  163.     i = *fa++;
  164.     j = *fa++;
  165.     do {
  166.         toffset = offset;
  167.         k = j;
  168.         do {
  169.         putbyt(*fa++,offset++);
  170.         } while ( --k != 0 );
  171.         if ( toffset < 0x2000 )
  172.         offset = toffset + 0x2000;
  173.         else
  174.         offset = toffset - 0x1fb0;
  175.     } while ( --i != 0 );
  176. }
  177.